home *** CD-ROM | disk | FTP | other *** search
- package sun.misc;
-
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- public class FloatingDecimal {
- boolean isExceptional;
- boolean isNegative;
- int decExponent;
- char[] digits;
- int nDigits;
- int bigIntExp;
- int bigIntNBits;
- boolean mustSetRoundDir = false;
- boolean fromHex = false;
- int roundDir = 0;
- static final long signMask = Long.MIN_VALUE;
- static final long expMask = 9218868437227405312L;
- static final long fractMask = 4503599627370495L;
- static final int expShift = 52;
- static final int expBias = 1023;
- static final long fractHOB = 4503599627370496L;
- static final long expOne = 4607182418800017408L;
- static final int maxSmallBinExp = 62;
- static final int minSmallBinExp = -21;
- static final int maxDecimalDigits = 15;
- static final int maxDecimalExponent = 308;
- static final int minDecimalExponent = -324;
- static final int bigDecimalExponent = 324;
- static final long highbyte = -72057594037927936L;
- static final long highbit = Long.MIN_VALUE;
- static final long lowbytes = 72057594037927935L;
- static final int singleSignMask = Integer.MIN_VALUE;
- static final int singleExpMask = 2139095040;
- static final int singleFractMask = 8388607;
- static final int singleExpShift = 23;
- static final int singleFractHOB = 8388608;
- static final int singleExpBias = 127;
- static final int singleMaxDecimalDigits = 7;
- static final int singleMaxDecimalExponent = 38;
- static final int singleMinDecimalExponent = -45;
- static final int intDecimalDigits = 9;
- private static FDBigInt[] b5p;
- private static ThreadLocal perThreadBuffer = new 1();
- private static final double[] small10pow = new double[]{(double)1.0F, (double)10.0F, (double)100.0F, (double)1000.0F, (double)10000.0F, (double)100000.0F, (double)1000000.0F, (double)1.0E7F, (double)1.0E8F, (double)1.0E9F, (double)1.0E10F, 1.0E11, 1.0E12, 1.0E13, 1.0E14, 1.0E15, 1.0E16, 1.0E17, 1.0E18, 1.0E19, 1.0E20, 1.0E21, 1.0E22};
- private static final float[] singleSmall10pow = new float[]{1.0F, 10.0F, 100.0F, 1000.0F, 10000.0F, 100000.0F, 1000000.0F, 1.0E7F, 1.0E8F, 1.0E9F, 1.0E10F};
- private static final double[] big10pow = new double[]{1.0E16, 1.0E32, 1.0E64, 1.0E128, 1.0E256};
- private static final double[] tiny10pow = new double[]{1.0E-16, 1.0E-32, 1.0E-64, 1.0E-128, 1.0E-256};
- private static final int maxSmallTen;
- private static final int singleMaxSmallTen;
- private static final int[] small5pow;
- private static final long[] long5pow;
- private static final int[] n5bits;
- private static final char[] infinity;
- private static final char[] notANumber;
- private static final char[] zero;
- private static Pattern hexFloatPattern;
-
- private FloatingDecimal(boolean var1, int var2, char[] var3, int var4, boolean var5) {
- this.isNegative = var1;
- this.isExceptional = var5;
- this.decExponent = var2;
- this.digits = var3;
- this.nDigits = var4;
- }
-
- private static int countBits(long var0) {
- if (var0 == 0L) {
- return 0;
- } else {
- while((var0 & -72057594037927936L) == 0L) {
- var0 <<= 8;
- }
-
- while(var0 > 0L) {
- var0 <<= 1;
- }
-
- int var2;
- for(var2 = 0; (var0 & 72057594037927935L) != 0L; var2 += 8) {
- var0 <<= 8;
- }
-
- while(var0 != 0L) {
- var0 <<= 1;
- ++var2;
- }
-
- return var2;
- }
- }
-
- private static synchronized FDBigInt big5pow(int var0) {
- assert var0 >= 0 : var0;
-
- if (b5p == null) {
- b5p = new FDBigInt[var0 + 1];
- } else if (b5p.length <= var0) {
- FDBigInt[] var1 = new FDBigInt[var0 + 1];
- System.arraycopy(b5p, 0, var1, 0, b5p.length);
- b5p = var1;
- }
-
- if (b5p[var0] != null) {
- return b5p[var0];
- } else if (var0 < small5pow.length) {
- return b5p[var0] = new FDBigInt(small5pow[var0]);
- } else if (var0 < long5pow.length) {
- return b5p[var0] = new FDBigInt(long5pow[var0]);
- } else {
- int var5 = var0 >> 1;
- int var2 = var0 - var5;
- FDBigInt var3 = b5p[var5];
- if (var3 == null) {
- var3 = big5pow(var5);
- }
-
- if (var2 < small5pow.length) {
- return b5p[var0] = var3.mult(small5pow[var2]);
- } else {
- FDBigInt var4 = b5p[var2];
- if (var4 == null) {
- var4 = big5pow(var2);
- }
-
- return b5p[var0] = var3.mult(var4);
- }
- }
- }
-
- private static FDBigInt multPow52(FDBigInt var0, int var1, int var2) {
- if (var1 != 0) {
- if (var1 < small5pow.length) {
- var0 = var0.mult(small5pow[var1]);
- } else {
- var0 = var0.mult(big5pow(var1));
- }
- }
-
- if (var2 != 0) {
- var0.lshiftMe(var2);
- }
-
- return var0;
- }
-
- private static FDBigInt constructPow52(int var0, int var1) {
- FDBigInt var2 = new FDBigInt(big5pow(var0));
- if (var1 != 0) {
- var2.lshiftMe(var1);
- }
-
- return var2;
- }
-
- private FDBigInt doubleToBigInt(double var1) {
- // $FF: Couldn't be decompiled
- }
-
- private static double ulp(double var0, boolean var2) {
- long var3 = Double.doubleToLongBits(var0) & Long.MAX_VALUE;
- int var5 = (int)(var3 >>> 52);
- if (var2 && var5 >= 52 && (var3 & 4503599627370495L) == 0L) {
- --var5;
- }
-
- double var6;
- if (var5 > 52) {
- var6 = Double.longBitsToDouble((long)(var5 - 52) << 52);
- } else if (var5 == 0) {
- var6 = Double.MIN_VALUE;
- } else {
- var6 = Double.longBitsToDouble(1L << var5 - 1);
- }
-
- if (var2) {
- var6 = -var6;
- }
-
- return var6;
- }
-
- float stickyRound(double var1) {
- long var3 = Double.doubleToLongBits(var1);
- long var5 = var3 & 9218868437227405312L;
- if (var5 != 0L && var5 != 9218868437227405312L) {
- var3 += (long)this.roundDir;
- return (float)Double.longBitsToDouble(var3);
- } else {
- return (float)var1;
- }
- }
-
- private void developLongDigits(int var1, long var2, long var4) {
- int var10;
- for(var10 = 0; var4 >= 10L; ++var10) {
- var4 /= 10L;
- }
-
- if (var10 != 0) {
- long var11 = long5pow[var10] << var10;
- long var13 = var2 % var11;
- var2 /= var11;
- var1 += var10;
- if (var13 >= var11 >> 1) {
- ++var2;
- }
- }
-
- char[] var6;
- byte var7;
- int var8;
- if (var2 <= 2147483647L) {
- assert var2 > 0L : var2;
-
- int var18 = (int)var2;
- var7 = 10;
- var6 = (char[])perThreadBuffer.get();
- var8 = var7 - 1;
- int var9 = var18 % 10;
-
- for(var18 /= 10; var9 == 0; var18 /= 10) {
- ++var1;
- var9 = var18 % 10;
- }
-
- while(var18 != 0) {
- var6[var8--] = (char)(var9 + 48);
- ++var1;
- var9 = var18 % 10;
- var18 /= 10;
- }
-
- var6[var8] = (char)(var9 + 48);
- } else {
- var7 = 20;
- var6 = (char[])perThreadBuffer.get();
- var8 = var7 - 1;
- int var17 = (int)(var2 % 10L);
-
- for(var2 /= 10L; var17 == 0; var2 /= 10L) {
- ++var1;
- var17 = (int)(var2 % 10L);
- }
-
- while(var2 != 0L) {
- var6[var8--] = (char)(var17 + 48);
- ++var1;
- var17 = (int)(var2 % 10L);
- var2 /= 10L;
- }
-
- var6[var8] = (char)(var17 + 48);
- }
-
- var7 -= var8;
- char[] var20 = new char[var7];
- System.arraycopy(var6, var8, var20, 0, var7);
- this.digits = var20;
- this.decExponent = var1 + 1;
- this.nDigits = var7;
- }
-
- private void roundup() {
- int var1;
- char var2 = this.digits[var1 = this.nDigits - 1];
- if (var2 == '9') {
- while(var2 == '9' && var1 > 0) {
- this.digits[var1] = '0';
- --var1;
- var2 = this.digits[var1];
- }
-
- if (var2 == '9') {
- ++this.decExponent;
- this.digits[0] = '1';
- return;
- }
- }
-
- this.digits[var1] = (char)(var2 + 1);
- }
-
- public FloatingDecimal(double var1) {
- long var3 = Double.doubleToLongBits(var1);
- if ((var3 & Long.MIN_VALUE) != 0L) {
- this.isNegative = true;
- var3 ^= Long.MIN_VALUE;
- } else {
- this.isNegative = false;
- }
-
- int var7 = (int)((var3 & 9218868437227405312L) >> 52);
- long var5 = var3 & 4503599627370495L;
- if (var7 == 2047) {
- this.isExceptional = true;
- if (var5 == 0L) {
- this.digits = infinity;
- } else {
- this.digits = notANumber;
- this.isNegative = false;
- }
-
- this.nDigits = this.digits.length;
- } else {
- this.isExceptional = false;
- int var8;
- if (var7 == 0) {
- if (var5 == 0L) {
- this.decExponent = 0;
- this.digits = zero;
- this.nDigits = 1;
- return;
- }
-
- while((var5 & 4503599627370496L) == 0L) {
- var5 <<= 1;
- --var7;
- }
-
- var8 = 52 + var7 + 1;
- ++var7;
- } else {
- var5 |= 4503599627370496L;
- var8 = 53;
- }
-
- var7 -= 1023;
- this.dtoa(var7, var5, var8);
- }
- }
-
- public FloatingDecimal(float var1) {
- int var2 = Float.floatToIntBits(var1);
- if ((var2 & Integer.MIN_VALUE) != 0) {
- this.isNegative = true;
- var2 ^= Integer.MIN_VALUE;
- } else {
- this.isNegative = false;
- }
-
- int var4 = (var2 & 2139095040) >> 23;
- int var3 = var2 & 8388607;
- if (var4 == 255) {
- this.isExceptional = true;
- if ((long)var3 == 0L) {
- this.digits = infinity;
- } else {
- this.digits = notANumber;
- this.isNegative = false;
- }
-
- this.nDigits = this.digits.length;
- } else {
- this.isExceptional = false;
- int var5;
- if (var4 == 0) {
- if (var3 == 0) {
- this.decExponent = 0;
- this.digits = zero;
- this.nDigits = 1;
- return;
- }
-
- while((var3 & 8388608) == 0) {
- var3 <<= 1;
- --var4;
- }
-
- var5 = 23 + var4 + 1;
- ++var4;
- } else {
- var3 |= 8388608;
- var5 = 24;
- }
-
- var4 -= 127;
- this.dtoa(var4, (long)var3 << 29, var5);
- }
- }
-
- private void dtoa(int var1, long var2, int var4) {
- int var5 = countBits(var2);
- int var6 = Math.max(0, var5 - var1 - 1);
- if (var1 <= 62 && var1 >= -21 && var6 < long5pow.length && var5 + n5bits[var6] < 64 && var6 == 0) {
- long var39;
- if (var1 > var4) {
- var39 = 1L << var1 - var4 - 1;
- } else {
- var39 = 0L;
- }
-
- if (var1 >= 52) {
- var2 <<= var1 - 52;
- } else {
- var2 >>>= 52 - var1;
- }
-
- this.developLongDigits(0, var2, var39);
- } else {
- double var8 = Double.longBitsToDouble(4607182418800017408L | var2 & -4503599627370497L);
- int var7 = (int)Math.floor((var8 - (double)1.5F) * 0.289529654 + 0.176091259 + (double)var1 * 0.301029995663981);
- int var11 = Math.max(0, -var7);
- int var10 = var11 + var6 + var1;
- int var13 = Math.max(0, var7);
- int var12 = var13 + var6;
- int var14 = var10 - var4;
- var2 >>>= 53 - var5;
- var10 -= var5 - 1;
- int var21 = Math.min(var10, var12);
- var10 -= var21;
- var12 -= var21;
- var14 -= var21;
- if (var5 == 1) {
- --var14;
- }
-
- if (var14 < 0) {
- var10 -= var14;
- var12 -= var14;
- var14 = 0;
- }
-
- char[] var22 = this.digits = new char[18];
- int var23 = 0;
- int var16 = var5 + var10 + (var11 < n5bits.length ? n5bits[var11] : var11 * 3);
- int var17 = var12 + 1 + (var13 + 1 < n5bits.length ? n5bits[var13 + 1] : (var13 + 1) * 3);
- boolean var24;
- boolean var25;
- long var26;
- if (var16 < 64 && var17 < 64) {
- if (var16 < 32 && var17 < 32) {
- int var53 = (int)var2 * small5pow[var11] << var10;
- int var55 = small5pow[var13] << var12;
- int var56 = small5pow[var11] << var14;
- int var32 = var55 * 10;
- var23 = 0;
- int var49 = var53 / var55;
- var53 = 10 * (var53 % var55);
- var56 *= 10;
- var24 = var53 < var56;
- var25 = var53 + var56 > var32;
-
- assert var49 < 10 : var49;
-
- if (var49 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var49);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- for(; !var24 && !var25; var22[var23++] = (char)(48 + var49)) {
- var49 = var53 / var55;
- var53 = 10 * (var53 % var55);
- var56 *= 10;
-
- assert var49 < 10 : var49;
-
- if ((long)var56 > 0L) {
- var24 = var53 < var56;
- var25 = var53 + var56 > var32;
- } else {
- var24 = true;
- var25 = true;
- }
- }
-
- var26 = (long)((var53 << 1) - var32);
- } else {
- long var51 = var2 * long5pow[var11] << var10;
- long var31 = long5pow[var13] << var12;
- long var33 = long5pow[var11] << var14;
- long var35 = var31 * 10L;
- var23 = 0;
- int var47 = (int)(var51 / var31);
- var51 = 10L * (var51 % var31);
- var33 *= 10L;
- var24 = var51 < var33;
- var25 = var51 + var33 > var35;
-
- assert var47 < 10 : var47;
-
- if (var47 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var47);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- for(; !var24 && !var25; var22[var23++] = (char)(48 + var47)) {
- var47 = (int)(var51 / var31);
- var51 = 10L * (var51 % var31);
- var33 *= 10L;
-
- assert var47 < 10 : var47;
-
- if (var33 > 0L) {
- var24 = var51 < var33;
- var25 = var51 + var33 > var35;
- } else {
- var24 = true;
- var25 = true;
- }
- }
-
- var26 = (var51 << 1) - var35;
- }
- } else {
- FDBigInt var19 = multPow52(new FDBigInt(var2), var11, var10);
- FDBigInt var18 = constructPow52(var13, var12);
- FDBigInt var20 = constructPow52(var11, var14);
- int var30;
- var19.lshiftMe(var30 = var18.normalizeMe());
- var20.lshiftMe(var30);
- FDBigInt var29 = var18.mult(10);
- var23 = 0;
- int var28 = var19.quoRemIteration(var18);
- var20 = var20.mult(10);
- var24 = var19.cmp(var20) < 0;
- var25 = var19.add(var20).cmp(var29) > 0;
-
- assert var28 < 10 : var28;
-
- if (var28 == 0 && !var25) {
- --var7;
- } else {
- var22[var23++] = (char)(48 + var28);
- }
-
- if (var7 <= -3 || var7 >= 8) {
- var24 = false;
- var25 = false;
- }
-
- while(!var24 && !var25) {
- var28 = var19.quoRemIteration(var18);
- var20 = var20.mult(10);
-
- assert var28 < 10 : var28;
-
- var24 = var19.cmp(var20) < 0;
- var25 = var19.add(var20).cmp(var29) > 0;
- var22[var23++] = (char)(48 + var28);
- }
-
- if (var25 && var24) {
- var19.lshiftMe(1);
- var26 = (long)var19.cmp(var29);
- } else {
- var26 = 0L;
- }
- }
-
- this.decExponent = var7 + 1;
- this.digits = var22;
- this.nDigits = var23;
- if (var25) {
- if (var24) {
- if (var26 == 0L) {
- if ((var22[this.nDigits - 1] & 1) != 0) {
- this.roundup();
- }
- } else if (var26 > 0L) {
- this.roundup();
- }
- } else {
- this.roundup();
- }
- }
-
- }
- }
-
- public String toString() {
- StringBuffer var1 = new StringBuffer(this.nDigits + 8);
- if (this.isNegative) {
- var1.append('-');
- }
-
- if (this.isExceptional) {
- var1.append(this.digits, 0, this.nDigits);
- } else {
- var1.append("0.");
- var1.append(this.digits, 0, this.nDigits);
- var1.append('e');
- var1.append(this.decExponent);
- }
-
- return new String(var1);
- }
-
- public String toJavaFormatString() {
- char[] var1 = (char[])perThreadBuffer.get();
- int var2 = this.getChars(var1);
- return new String(var1, 0, var2);
- }
-
- private int getChars(char[] var1) {
- assert this.nDigits <= 19 : this.nDigits;
-
- int var2 = 0;
- if (this.isNegative) {
- var1[0] = '-';
- var2 = 1;
- }
-
- if (this.isExceptional) {
- System.arraycopy(this.digits, 0, var1, var2, this.nDigits);
- var2 += this.nDigits;
- } else if (this.decExponent > 0 && this.decExponent < 8) {
- int var20 = Math.min(this.nDigits, this.decExponent);
- System.arraycopy(this.digits, 0, var1, var2, var20);
- var2 += var20;
- if (var20 < this.decExponent) {
- var20 = this.decExponent - var20;
- System.arraycopy(zero, 0, var1, var2, var20);
- var2 += var20;
- var1[var2++] = '.';
- var1[var2++] = '0';
- } else {
- var1[var2++] = '.';
- if (var20 < this.nDigits) {
- int var4 = this.nDigits - var20;
- System.arraycopy(this.digits, var20, var1, var2, var4);
- var2 += var4;
- } else {
- var1[var2++] = '0';
- }
- }
- } else if (this.decExponent <= 0 && this.decExponent > -3) {
- var1[var2++] = '0';
- var1[var2++] = '.';
- if (this.decExponent != 0) {
- System.arraycopy(zero, 0, var1, var2, -this.decExponent);
- var2 -= this.decExponent;
- }
-
- System.arraycopy(this.digits, 0, var1, var2, this.nDigits);
- var2 += this.nDigits;
- } else {
- var1[var2++] = this.digits[0];
- var1[var2++] = '.';
- if (this.nDigits > 1) {
- System.arraycopy(this.digits, 1, var1, var2, this.nDigits - 1);
- var2 += this.nDigits - 1;
- } else {
- var1[var2++] = '0';
- }
-
- var1[var2++] = 'E';
- int var3;
- if (this.decExponent <= 0) {
- var1[var2++] = '-';
- var3 = -this.decExponent + 1;
- } else {
- var3 = this.decExponent - 1;
- }
-
- if (var3 <= 9) {
- var1[var2++] = (char)(var3 + 48);
- } else if (var3 <= 99) {
- var1[var2++] = (char)(var3 / 10 + 48);
- var1[var2++] = (char)(var3 % 10 + 48);
- } else {
- var1[var2++] = (char)(var3 / 100 + 48);
- var3 %= 100;
- var1[var2++] = (char)(var3 / 10 + 48);
- var1[var2++] = (char)(var3 % 10 + 48);
- }
- }
-
- return var2;
- }
-
- public void appendTo(Appendable var1) {
- char[] var2 = (char[])perThreadBuffer.get();
- int var3 = this.getChars(var2);
- if (var1 instanceof StringBuilder) {
- ((StringBuilder)var1).append(var2, 0, var3);
- } else if (var1 instanceof StringBuffer) {
- ((StringBuffer)var1).append(var2, 0, var3);
- } else {
- assert false;
- }
-
- }
-
- public static FloatingDecimal readJavaFormatString(String var0) throws NumberFormatException {
- boolean var1 = false;
- boolean var2 = false;
-
- try {
- var0 = var0.trim();
- int var5 = var0.length();
- if (var5 == 0) {
- throw new NumberFormatException("empty String");
- }
-
- int var6 = 0;
- switch (var0.charAt(var6)) {
- case '-':
- var1 = true;
- case '+':
- ++var6;
- var2 = true;
- }
-
- char var4 = var0.charAt(var6);
- if (var4 != 'N' && var4 != 'I') {
- if (var4 == '0' && var5 > var6 + 1) {
- char var23 = var0.charAt(var6 + 1);
- if (var23 == 'x' || var23 == 'X') {
- return parseHexString(var0);
- }
- }
-
- char[] var24 = new char[var5];
- int var26 = 0;
- boolean var27 = false;
- int var10 = 0;
- int var11 = 0;
-
- int var12;
- label181:
- for(var12 = 0; var6 < var5; ++var6) {
- switch (var4 = var0.charAt(var6)) {
- case '.':
- if (var27) {
- throw new NumberFormatException("multiple points");
- }
-
- var10 = var6;
- if (var2) {
- var10 = var6 - 1;
- }
-
- var27 = true;
- continue;
- case '/':
- default:
- break label181;
- case '0':
- if (var26 > 0) {
- ++var12;
- } else {
- ++var11;
- }
- continue;
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- }
-
- while(var12 > 0) {
- var24[var26++] = '0';
- --var12;
- }
-
- var24[var26++] = var4;
- }
-
- if (var26 == 0) {
- var24 = zero;
- var26 = 1;
- if (var11 == 0) {
- throw new NumberFormatException("For input string: \"" + var0 + "\"");
- }
- }
-
- int var3;
- if (var27) {
- var3 = var10 - var11;
- } else {
- var3 = var26 + var12;
- }
-
- if (var6 < var5 && ((var4 = var0.charAt(var6)) == 'e' || var4 == 'E')) {
- byte var13 = 1;
- int var14 = 0;
- int var15 = 214748364;
- boolean var16 = false;
- ++var6;
- int var17;
- switch (var0.charAt(var6)) {
- case '-':
- var13 = -1;
- case '+':
- ++var6;
- default:
- var17 = var6;
- }
-
- label153:
- while(var6 < var5) {
- if (var14 >= var15) {
- var16 = true;
- }
-
- switch (var4 = var0.charAt(var6++)) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- var14 = var14 * 10 + (var4 - 48);
- break;
- default:
- --var6;
- break label153;
- }
- }
-
- int var18 = 324 + var26 + var12;
- if (!var16 && var14 <= var18) {
- var3 += var13 * var14;
- } else {
- var3 = var13 * var18;
- }
-
- if (var6 == var17) {
- throw new NumberFormatException("For input string: \"" + var0 + "\"");
- }
- }
-
- if (var6 >= var5 || var6 == var5 - 1 && (var0.charAt(var6) == 'f' || var0.charAt(var6) == 'F' || var0.charAt(var6) == 'd' || var0.charAt(var6) == 'D')) {
- return new FloatingDecimal(var1, var3, var24, var26, false);
- }
- } else {
- boolean var7 = false;
- Object var8 = null;
- char[] var25;
- if (var4 == 'N') {
- var25 = notANumber;
- var7 = true;
- } else {
- var25 = infinity;
- }
-
- int var9;
- for(var9 = 0; var6 < var5 && var9 < var25.length; ++var9) {
- if (var0.charAt(var6) != var25[var9]) {
- throw new NumberFormatException("For input string: \"" + var0 + "\"");
- }
-
- ++var6;
- }
-
- if (var9 == var25.length && var6 == var5) {
- return var7 ? new FloatingDecimal(Double.NaN) : new FloatingDecimal(var1 ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY);
- }
- }
- } catch (StringIndexOutOfBoundsException var19) {
- }
-
- throw new NumberFormatException("For input string: \"" + var0 + "\"");
- }
-
- public double doubleValue() {
- int var1 = Math.min(this.nDigits, 16);
- if (this.digits != infinity && this.digits != notANumber) {
- if (this.mustSetRoundDir) {
- this.roundDir = 0;
- }
-
- int var10 = this.digits[0] - 48;
- int var11 = Math.min(var1, 9);
-
- for(int var12 = 1; var12 < var11; ++var12) {
- var10 = var10 * 10 + this.digits[var12] - 48;
- }
-
- long var2 = (long)var10;
-
- for(int var32 = var11; var32 < var1; ++var32) {
- var2 = var2 * 10L + (long)(this.digits[var32] - 48);
- }
-
- double var4 = (double)var2;
- int var33 = this.decExponent - var1;
- if (this.nDigits <= 15) {
- if (var33 == 0 || var4 == (double)0.0F) {
- return this.isNegative ? -var4 : var4;
- }
-
- if (var33 >= 0) {
- if (var33 <= maxSmallTen) {
- double var28 = var4 * small10pow[var33];
- if (this.mustSetRoundDir) {
- double var30 = var28 / small10pow[var33];
- this.roundDir = var30 == var4 ? 0 : (var30 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var28 : var28;
- }
-
- int var13 = 15 - var1;
- if (var33 <= maxSmallTen + var13) {
- var4 *= small10pow[var13];
- double var6 = var4 * small10pow[var33 - var13];
- if (this.mustSetRoundDir) {
- double var8 = var6 / small10pow[var33 - var13];
- this.roundDir = var8 == var4 ? 0 : (var8 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var6 : var6;
- }
- } else if (var33 >= -maxSmallTen) {
- double var29 = var4 / small10pow[-var33];
- double var31 = var29 * small10pow[-var33];
- if (this.mustSetRoundDir) {
- this.roundDir = var31 == var4 ? 0 : (var31 < var4 ? 1 : -1);
- }
-
- return this.isNegative ? -var29 : var29;
- }
- }
-
- if (var33 > 0) {
- if (this.decExponent > 309) {
- return this.isNegative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- }
-
- if ((var33 & 15) != 0) {
- var4 *= small10pow[var33 & 15];
- }
-
- if ((var33 = var33 >> 4) != 0) {
- int var38;
- for(var38 = 0; var33 > 1; var33 >>= 1) {
- if ((var33 & 1) != 0) {
- var4 *= big10pow[var38];
- }
-
- ++var38;
- }
-
- double var14 = var4 * big10pow[var38];
- if (Double.isInfinite(var14)) {
- var14 = var4 / (double)2.0F;
- var14 *= big10pow[var38];
- if (Double.isInfinite(var14)) {
- return this.isNegative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- }
-
- var14 = Double.MAX_VALUE;
- }
-
- var4 = var14;
- }
- } else if (var33 < 0) {
- var33 = -var33;
- if (this.decExponent < -325) {
- return this.isNegative ? (double)-0.0F : (double)0.0F;
- }
-
- if ((var33 & 15) != 0) {
- var4 /= small10pow[var33 & 15];
- }
-
- if ((var33 = var33 >> 4) != 0) {
- int var39;
- for(var39 = 0; var33 > 1; var33 >>= 1) {
- if ((var33 & 1) != 0) {
- var4 *= tiny10pow[var39];
- }
-
- ++var39;
- }
-
- double var43 = var4 * tiny10pow[var39];
- if (var43 == (double)0.0F) {
- var43 = var4 * (double)2.0F;
- var43 *= tiny10pow[var39];
- if (var43 == (double)0.0F) {
- return this.isNegative ? (double)-0.0F : (double)0.0F;
- }
-
- var43 = Double.MIN_VALUE;
- }
-
- var4 = var43;
- }
- }
-
- FDBigInt var40 = new FDBigInt(var2, this.digits, var1, this.nDigits);
- var33 = this.decExponent - this.nDigits;
-
- do {
- FDBigInt var46 = this.doubleToBigInt(var4);
- int var15;
- int var16;
- int var17;
- int var18;
- if (var33 >= 0) {
- var16 = 0;
- var15 = 0;
- var18 = var33;
- var17 = var33;
- } else {
- var15 = var16 = -var33;
- var18 = 0;
- var17 = 0;
- }
-
- if (this.bigIntExp >= 0) {
- var15 += this.bigIntExp;
- } else {
- var17 -= this.bigIntExp;
- }
-
- int var20;
- if (this.bigIntExp + this.bigIntNBits <= -1022) {
- var20 = this.bigIntExp + 1023 + 52;
- } else {
- var20 = 54 - this.bigIntNBits;
- }
-
- int var48 = var15 + var20;
- var17 += var20;
- int var21 = Math.min(var48, Math.min(var17, var15));
- int var49 = var48 - var21;
- var17 -= var21;
- int var52 = var15 - var21;
- var46 = multPow52(var46, var16, var49);
- FDBigInt var22 = multPow52(new FDBigInt(var40), var18, var17);
- FDBigInt var23;
- int var24;
- boolean var25;
- if ((var24 = var46.cmp(var22)) > 0) {
- var25 = true;
- var23 = var46.sub(var22);
- if (this.bigIntNBits == 1 && this.bigIntExp > -1023) {
- --var52;
- if (var52 < 0) {
- var52 = 0;
- var23.lshiftMe(1);
- }
- }
- } else {
- if (var24 >= 0) {
- break;
- }
-
- var25 = false;
- var23 = var22.sub(var46);
- }
-
- FDBigInt var26 = constructPow52(var16, var52);
- if ((var24 = var23.cmp(var26)) < 0) {
- if (this.mustSetRoundDir) {
- this.roundDir = var25 ? -1 : 1;
- }
- break;
- }
-
- if (var24 == 0) {
- var4 += (double)0.5F * ulp(var4, var25);
- if (this.mustSetRoundDir) {
- this.roundDir = var25 ? -1 : 1;
- }
- break;
- }
-
- var4 += ulp(var4, var25);
- } while(var4 != (double)0.0F && var4 != Double.POSITIVE_INFINITY);
-
- return this.isNegative ? -var4 : var4;
- } else if (this.digits == notANumber) {
- return Double.NaN;
- } else {
- return this.isNegative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
- }
- }
-
- public float floatValue() {
- int var1 = Math.min(this.nDigits, 8);
- if (this.digits != infinity && this.digits != notANumber) {
- int var2 = this.digits[0] - 48;
-
- for(int var4 = 1; var4 < var1; ++var4) {
- var2 = var2 * 10 + this.digits[var4] - 48;
- }
-
- float var3 = (float)var2;
- int var14 = this.decExponent - var1;
- if (this.nDigits <= 7) {
- if (var14 == 0 || var3 == 0.0F) {
- return this.isNegative ? -var3 : var3;
- }
-
- if (var14 >= 0) {
- if (var14 <= singleMaxSmallTen) {
- var3 *= singleSmall10pow[var14];
- return this.isNegative ? -var3 : var3;
- }
-
- int var5 = 7 - var1;
- if (var14 <= singleMaxSmallTen + var5) {
- var3 *= singleSmall10pow[var5];
- var3 *= singleSmall10pow[var14 - var5];
- return this.isNegative ? -var3 : var3;
- }
- } else if (var14 >= -singleMaxSmallTen) {
- var3 /= singleSmall10pow[-var14];
- return this.isNegative ? -var3 : var3;
- }
- } else if (this.decExponent >= this.nDigits && this.nDigits + this.decExponent <= 15) {
- long var17 = (long)var2;
-
- for(int var7 = var1; var7 < this.nDigits; ++var7) {
- var17 = var17 * 10L + (long)(this.digits[var7] - 48);
- }
-
- double var18 = (double)var17;
- var14 = this.decExponent - this.nDigits;
- var18 *= small10pow[var14];
- var3 = (float)var18;
- return this.isNegative ? -var3 : var3;
- }
-
- if (this.decExponent > 39) {
- return this.isNegative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
- } else if (this.decExponent < -46) {
- return this.isNegative ? -0.0F : 0.0F;
- } else {
- this.mustSetRoundDir = !this.fromHex;
- double var16 = this.doubleValue();
- return this.stickyRound(var16);
- }
- } else if (this.digits == notANumber) {
- return Float.NaN;
- } else {
- return this.isNegative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
- }
- }
-
- static FloatingDecimal parseHexString(String var0) {
- Matcher var1 = hexFloatPattern.matcher(var0);
- boolean var2 = var1.matches();
- if (!var2) {
- throw new NumberFormatException("For input string: \"" + var0 + "\"");
- } else {
- String var3 = var1.group(1);
- double var4 = var3 != null && !var3.equals("+") ? (double)-1.0F : (double)1.0F;
- Object var6 = null;
- int var7 = 0;
- int var8 = 0;
- int var9 = 0;
- int var10 = 0;
- String var11;
- String var30;
- if ((var11 = var1.group(4)) != null) {
- var30 = stripLeadingZeros(var11);
- var9 = var30.length();
- } else {
- String var12 = stripLeadingZeros(var1.group(6));
- var9 = var12.length();
- String var13 = var1.group(7);
- var10 = var13.length();
- var30 = (var12 == null ? "" : var12) + var13;
- }
-
- var30 = stripLeadingZeros(var30);
- var7 = var30.length();
- if (var9 >= 1) {
- var8 = 4 * (var9 - 1);
- } else {
- var8 = -4 * (var10 - var7 + 1);
- }
-
- if (var7 == 0) {
- return new FloatingDecimal(var4 * (double)0.0F);
- } else {
- String var35 = var1.group(8);
- var10 = var35 == null || var35.equals("+");
-
- try {
- var37 = (long)Integer.parseInt(var1.group(9));
- } catch (NumberFormatException var29) {
- return new FloatingDecimal(var4 * (var10 ? Double.POSITIVE_INFINITY : (double)0.0F));
- }
-
- long var38 = (var10 ? 1L : -1L) * var37;
- long var15 = var38 + (long)var8;
- boolean var17 = false;
- boolean var18 = false;
- boolean var19 = false;
- int var20 = 0;
- long var21 = 0L;
- long var23 = (long)getHexDigit(var30, 0);
- if (var23 == 1L) {
- var21 |= var23 << 52;
- var20 = 48;
- } else if (var23 <= 3L) {
- var21 |= var23 << 51;
- var20 = 47;
- ++var15;
- } else if (var23 <= 7L) {
- var21 |= var23 << 50;
- var20 = 46;
- var15 += 2L;
- } else {
- if (var23 > 15L) {
- throw new AssertionError("Result from digit conversion too large!");
- }
-
- var21 |= var23 << 49;
- var20 = 45;
- var15 += 3L;
- }
-
- int var25 = 0;
-
- for(var25 = 1; var25 < var7 && var20 >= 0; ++var25) {
- long var26 = (long)getHexDigit(var30, var25);
- var21 |= var26 << var20;
- var20 -= 4;
- }
-
- if (var25 < var7) {
- long var46 = (long)getHexDigit(var30, var25);
- switch (var20) {
- case -4:
- var17 = (var46 & 8L) != 0L;
- var18 = (var46 & 7L) != 0L;
- break;
- case -3:
- var21 |= (var46 & 8L) >> 3;
- var17 = (var46 & 4L) != 0L;
- var18 = (var46 & 3L) != 0L;
- break;
- case -2:
- var21 |= (var46 & 12L) >> 2;
- var17 = (var46 & 2L) != 0L;
- var18 = (var46 & 1L) != 0L;
- break;
- case -1:
- var21 |= (var46 & 14L) >> 1;
- var17 = (var46 & 1L) != 0L;
- break;
- default:
- throw new AssertionError("Unexpected shift distance remainder.");
- }
-
- ++var25;
-
- while(var25 < var7 && !var18) {
- var46 = (long)getHexDigit(var30, var25);
- var18 = var18 || var46 != 0L;
- ++var25;
- }
- }
-
- if (var15 > 1023L) {
- return new FloatingDecimal(var4 * Double.POSITIVE_INFINITY);
- } else {
- if (var15 <= 1023L && var15 >= -1022L) {
- var21 = var15 + 1023L << 52 & 9218868437227405312L | 4503599627370495L & var21;
- } else {
- if (var15 < -1075L) {
- return new FloatingDecimal(var4 * (double)0.0F);
- }
-
- var18 = var18 || var17;
- var17 = false;
- int var48 = 53 - ((int)var15 - -1074 + 1);
-
- assert var48 >= 1 && var48 <= 53;
-
- var17 = (var21 & 1L << var48 - 1) != 0L;
- if (var48 > 1) {
- long var27 = ~(-1L << var48 - 1);
- var18 = var18 || (var21 & var27) != 0L;
- }
-
- var21 >>= var48;
- var21 = 0L | 4503599627370495L & var21;
- }
-
- boolean var49 = false;
- boolean var51 = (var21 & 1L) == 0L;
- if (var51 && var17 && var18 || !var51 && var17) {
- var49 = true;
- ++var21;
- }
-
- FloatingDecimal var28 = new FloatingDecimal(FpUtils.rawCopySign(Double.longBitsToDouble(var21), var4));
- if (var15 >= -150L && var15 <= 127L && (var21 & 268435455L) == 0L && (var17 || var18)) {
- if (var51) {
- if (var17 ^ var18) {
- var28.roundDir = 1;
- }
- } else if (var17) {
- var28.roundDir = -1;
- }
- }
-
- var28.fromHex = true;
- return var28;
- }
- }
- }
- }
-
- static String stripLeadingZeros(String var0) {
- return var0.replaceFirst("^0+", "");
- }
-
- static int getHexDigit(String var0, int var1) {
- int var2 = Character.digit(var0.charAt(var1), 16);
- if (var2 > -1 && var2 < 16) {
- return var2;
- } else {
- throw new AssertionError("Unexpected failure of digit conversion of " + var0.charAt(var1));
- }
- }
-
- static {
- maxSmallTen = small10pow.length - 1;
- singleMaxSmallTen = singleSmall10pow.length - 1;
- small5pow = new int[]{1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125};
- long5pow = new long[]{1L, 5L, 25L, 125L, 625L, 3125L, 15625L, 78125L, 390625L, 1953125L, 9765625L, 48828125L, 244140625L, 1220703125L, 6103515625L, 30517578125L, 152587890625L, 762939453125L, 3814697265625L, 19073486328125L, 95367431640625L, 476837158203125L, 2384185791015625L, 11920928955078125L, 59604644775390625L, 298023223876953125L, 1490116119384765625L};
- n5bits = new int[]{0, 3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, 47, 49, 52, 54, 56, 59, 61};
- infinity = new char[]{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'};
- notANumber = new char[]{'N', 'a', 'N'};
- zero = new char[]{'0', '0', '0', '0', '0', '0', '0', '0'};
- hexFloatPattern = Pattern.compile("([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?");
- }
- }
-